#include <bits/stdc++.h>

using namespace std;

// 解决单个测试用例的函数
void solve() {
  // n: 初始元素数量，m: 可执行的操作次数，k: 要查找的第k大元素
  int n, K, X;
  cin >> n >> K >> X;

  // 使用优先队列（最大堆）存储元素值及其对应的数量
  priority_queue<pair<double, long long>> q;

  // 读取初始元素并加入优先队列，每个元素初始数量为1
  for (int i = 1; i <= n; ++i) {
    int a;
    cin >> a;
    q.push({a, 1});
  }

  // 执行m次减半操作
  while (K) {
    // double a = q.top().first;     // 当前最大值
    // long long c = q.top().second; // 该值的数量

    double a;
    long long c;
    tie(a, c) = q.top();

    q.pop();

    if (K >= c) {
      // 如果剩余操作次数足够处理所有当前值
      K -= c;                 // 消耗c次操作
      q.push({a / 2, c * 2}); // 将当前值减半，数量翻倍
    } else {
      // 如果剩余操作次数不足处理所有当前值
      q.push({a, c - K});     // 将未处理的元素放回队列
      q.push({a / 2, K * 2}); // 将处理的k个元素减半，数量为2k
      K = 0;                  // 操作次数用完
    }
  }

  // 查找第X大的元素
  while (!q.empty()) {
    double a = q.top().first;     // 当前最大值
    long long c = q.top().second; // 该值的数量
    q.pop();

    if (X <= c) {
      // 找到第k大的元素，输出结果，保留18位小数
      cout << fixed << setprecision(18) << a << endl;
      break;
    } else {
      // 继续查找下一个较小的值
      X -= c;
    }
  }
}

int main() {
  int t; // 测试用例数量
  cin >> t;

  while (t--) {
    solve(); // 处理每个测试用例
  }

  return 0;
}